package org.zcl.service.impl;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.zcl.model.UserInfo;
import org.zcl.service.UserInfoService;

import javax.jws.WebService;

/**
 * .
 *
 * @author zhuchenglin
 * @since 2024/8/9 11:46
 */
/**
 * WebService涉及到的有这些 "四解三类 ", 即四个注解，三个类
 * @WebMethod
 * @WebService
 * @WebResult
 * @WebParam
 * SpringBus
 * Endpoint
 * EndpointImpl
 *
 * 一般我们都会写一个接口，然后再写一个实现接口的实现类，但是这不是强制性的
 * @WebService 注解表明是一个webservice服务。
 *      name：对外发布的服务名, 对应于<wsdl:portType name="ServerServiceDemo"></wsdl:portType>
 *      targetNamespace：命名空间,一般是接口的包名倒序, 实现类与接口类的这个配置一定要一致这种错误
 *              Exception in thread "main" org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name xxxx
 *              对应于targetNamespace="http://server.webservice.example.com"
 *      endpointInterface：服务接口全路径（如果是没有接口，直接写实现类的，该属性不用配置）, 指定做SEI（Service EndPoint Interface）服务端点接口
 *      serviceName：对应于<wsdl:service name="ServerServiceDemoImplService"></wsdl:service>
 *      portName：对应于<wsdl:port binding="tns:ServerServiceDemoImplServiceSoapBinding" name="ServerServiceDemoPort"></wsdl:port>
 *
 * @WebMethod 表示暴露的服务方法, 这里有接口ServerServiceDemo存在，在接口方法已加上@WebMethod, 所以在实现类中不用再加上，否则就要加上
 *      operationName: 接口的方法名
 *      action: 没发现又什么用处
 *      exclude: 默认是false, 用于阻止将某一继承方法公开为web服务
 *
 * @WebResult 表示方法的返回值
 *      name：返回值的名称
 *      partName：
 *      targetNamespace:
 *      header: 默认是false, 是否将参数放到头信息中，用于保护参数，默认在body中
 *
 * @WebParam
 *       name：接口的参数
 *       partName：
 *       targetNamespace:
 *       header: 默认是false, 是否将参数放到头信息中，用于保护参数，默认在body中
 *       model：WebParam.Mode.IN/OUT/INOUT
 */
@Service
@WebService(serviceName = "userInfoService", targetNamespace = "http://service.zcl.org", endpointInterface = "org.zcl.service.UserInfoService")
@Slf4j
public class UserInfoServiceImpl implements UserInfoService {
    @Override
    public void saveUserInfo(UserInfo userInfo) {
        System.out.println("保存用户信息成功" + userInfo.toString());
    }

    @Override
    public UserInfo getUserInfoById(Long id) {
        UserInfo zhangsan = UserInfo.builder().id(1L).username("zhangsan").password("123456").build();
        log.info(JSON.toJSONString(zhangsan));
        return zhangsan;
    }
}
